package org.front.client.widget.listeproduitwidget;

import java.util.ArrayList;
import java.util.List;

import org.front.client.service.DistributeurService;
import org.front.client.service.DistributeurServiceAsync;
import org.front.client.widget.listeproduitwidget.event.ListeProduitWidgetEvent;
import org.front.client.widget.listeproduitwidget.event.ListeProduitWidgetHandler;
import org.front.client.widget.mainwidget.i18n.images.MainWidgetImages;
import org.front.shared.data.Produit;
import org.front.shared.wrap.StatistiqueRequest;
import org.front.shared.wrap.StatistiqueResponse;
import org.front.shared.wrap.TypeStatistique;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.shared.EventBus;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.resources.client.ClientBundle;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiTemplate;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Widget;

public class ListeProduitWidget extends Composite implements ListeProduitWidgetHandler {

	private final DistributeurServiceAsync distributeurService = GWT.create(DistributeurService.class);

	Grid gridProduits;

	/** UIBinder bindings */
	@UiField
	FlowPanel rootPanel;
	@UiField
	FlowPanel loading;
	@UiField
	FlowPanel panelProduits;

	private List<Produit> listProduits;

	/** event bus on which to commit */
	private final EventBus eventBus;

	/** Handlers the widget registers */
	private final List<HandlerRegistration> handlersRegistration;

	/**
	 * Client Bundle resources for this widget
	 */
	public interface Resources extends ClientBundle {

		/** Instance */
		public Resources INSTANCE = GWT.create(Resources.class);

		/**
		 * @return Css
		 */
		@Source("ListeProduitWidget.css")
		ListeProduitWidgetCssResources css();

		/**
		 * @return Images du widget
		 */
		MainWidgetImages images();
	}

	/**
	 * Declare UIBinder for this widget
	 */
	@UiTemplate("ListeProduitWidget.ui.xml")
	interface MainWidgetUiBinder extends UiBinder<Widget, ListeProduitWidget> {
	}

	/** UIBinder for building interface */
	private final MainWidgetUiBinder uiBinder;

	public ListeProduitWidget(EventBus eventBus) {

		this.eventBus = eventBus;

		// registration of handlers
		this.handlersRegistration = new ArrayList<HandlerRegistration>();

		// create UI
		this.uiBinder = GWT.create(MainWidgetUiBinder.class);
		initWidget(this.uiBinder.createAndBindUi(this));
		Resources.INSTANCE.css().ensureInjected();
		rootPanel.setStyleName("main");
	}

	public void initialiserData() {
		this.loading.setVisible(true);
		initListProduits();
	}

	private void afficherListProduit() {

		if (gridProduits != null) {
			panelProduits.remove(gridProduits);
		}

		gridProduits = new Grid(listProduits.size(), 2);

		for (int i = 0; i < listProduits.size(); i++) {
			Produit produit = listProduits.get(i);
			gridProduits.setWidget(i, 0, new Label(produit.getDescription()));
			gridProduits.setWidget(i, 1, new Label(String.valueOf(produit.getPrix())));
		}

		this.loading.setVisible(false);
		panelProduits.add(gridProduits);
	}

	/**
	 * 
	 */
	private void initListProduits() {

		StatistiqueRequest request = new StatistiqueRequest();

		DateTimeFormat dateFormat = DateTimeFormat.getFormat("dd/MM/yyyy");
		request.setDateDebut(dateFormat.parse("01/01/2011"));
		request.setDateFin(dateFormat.parse("31/12/2011"));

		request.setTypeStatistique(TypeStatistique.MEILLEUR_PRODUIT);

		distributeurService.getStatistique(request, new AsyncCallback<StatistiqueResponse>() {

			@Override
			public void onSuccess(StatistiqueResponse response) {
				GWT.log("Success : getStatistique");
				populateData(response);
			}

			@Override
			public void onFailure(Throwable caught) {
				GWT.log("Failure : getStatistique " + caught);
			}
		});
	}

	/**
	 * Recuperation du distributeur et appel a l'affichage des blocs
	 * 
	 * @param result
	 */
	private void populateData(StatistiqueResponse response) {
		listProduits = response.getListMeilleurProduits();
		GWT.log(listProduits.size() + "");
		afficherListProduit();
	}

	@Override
	protected void onLoad() {
		super.onLoad();
		bind();
	}

	@Override
	protected void onUnload() {
		super.onUnload();
		unbind();
	}

	/**
	 * Bind handler
	 */
	protected void bind() {
		this.handlersRegistration.add(this.eventBus.addHandler(ListeProduitWidgetEvent.TYPE, this));
	}

	/**
	 * Unbing handler
	 */
	protected void unbind() {
		// remove handlers registration
		for (final HandlerRegistration hr : this.handlersRegistration) {
			hr.removeHandler();
		}
		this.handlersRegistration.clear();
	}

	@Override
	public void onMainWidget(ListeProduitWidgetEvent event) {
		// TODO Auto-generated method stub

	}
}
